"""
事务管理功能演示示例

该示例展示了SQLServerManager类的事务管理功能，包括事务的开始、提交和回滚操作，
以及如何确保在发生错误时数据的一致性。
"""
from modules.database.sqlserver_manager import SQLServerManager
import logging

# 配置日志
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
logger = logging.getLogger('sqlserver_manager')
logger.addHandler(handler)
logger.setLevel(logging.INFO)

def demonstrate_transaction_management():
    # 数据库连接参数
    db_config = {
        'server': 'localhost',
        'database': 'test_db',
        'username': 'sa',
        'password': 'your_password',
        'port': 1433
    }

    # 使用上下文管理器确保连接正确关闭
    with SQLServerManager(**db_config) as db:
        try:
            # 1. 创建演示表
            logger.info("创建演示表...")
            db.execute_non_query("""
                CREATE TABLE IF NOT EXISTS Employee (
                    ID INT PRIMARY KEY IDENTITY(1,1),
                    Name NVARCHAR(50) NOT NULL,
                    Department NVARCHAR(50) NOT NULL,
                    Salary DECIMAL(10,2) NOT NULL
                )
            """)

            # 2. 演示正常事务提交
            logger.info("\n=== 演示正常事务提交 ===")
            db.begin_transaction()
            
            # 插入两条记录
            db.insert("Employee", {"Name": "John Doe", "Department": "Engineering", "Salary": 75000})
            db.insert("Employee", {"Name": "Jane Smith", "Department": "Marketing", "Salary": 65000})
            
            # 提交事务
            db.commit()
            logger.info("事务提交成功")

            # 验证数据
            result = db.execute_query("SELECT * FROM Employee")
            logger.info(f"提交后的数据: {len(result)} 条记录")

            # 3. 演示事务回滚
            logger.info("\n=== 演示事务回滚 ===")
            db.begin_transaction()
            
            # 插入一条新记录
            db.insert("Employee", {"Name": "Bob Johnson", "Department": "HR", "Salary": 60000})
            
            # 故意引发错误
            logger.info("故意引发除以零错误以触发回滚...")
            1 / 0  # 这将引发ZeroDivisionError
            
            # 以下代码不会执行
            db.commit()
            logger.info("事务提交成功")

        except ZeroDivisionError:
            # 回滚事务
            db.rollback()
            logger.warning("捕获到错误，事务已回滚")

        except Exception as e:
            # 回滚事务
            db.rollback()
            logger.error(f"发生错误: {str(e)}, 事务已回滚")

        finally:
            # 4. 验证最终数据
            result = db.execute_query("SELECT * FROM Employee")
            logger.info(f"\n最终数据状态: {len(result)} 条记录")

            # 5. 清理演示表
            logger.info("清理演示表...")
            db.execute_non_query("DROP TABLE IF EXISTS Employee")

if __name__ == "__main__":
    demonstrate_transaction_management()